package projeto.model.testes;

import static org.junit.Assert.*;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;

import projeto.model.Estabelecimento;
import projeto.model.LeituraDeDados;
import projeto.model.Usuario;
/**
 * 
 * @author Javatar
 * Classe usada para fazer testes da classe LeituraDeDados (JUnit 4)
 */
public class TestaLeituraDeDados {
	private Usuario user1,user2;
	private Integer[] opinioes1 = {4,2,0,0,5,1,1,1,-1,2,-4,2,0,-5,-2,4,0,0,3,3,-2,0,0,0,4,3,0,0,0,0,-1,0,0,0,2,0,0,0,2};
	private List<Integer> listaOpinioes1 = Arrays.asList(opinioes1);
	Integer[] opinioes2 = {3,0,0,0,0,0,0,0,2,3,2,0,0,1,0,4,0,0,0,5,0,0,0,0,0,0,0,0,1,2,0,0,0,2,0,0,3,0,0};
	private List<Integer> listaOpinioes2 = Arrays.asList(opinioes2);
	private List<Estabelecimento> estabelecimentosListaVazia;
	private List<Usuario> usuarios;
	
	@Before
	public void criaObjetosDeTeste() throws Exception{
		user1 = new Usuario("13/05/2011 18:35:48","Nazareno",listaOpinioes1);
		user2 = new Usuario("13/05/2011 18:46:59","Joao",listaOpinioes2);
		estabelecimentosListaVazia = new ArrayList<Estabelecimento>();
		usuarios = new ArrayList<Usuario>();
		usuarios.add(user1);
		usuarios.add(user2);
		criaArquivoTeste("ArquivoDeUsuarioValido.data",usuarios);
		criaArquivoTeste("ArquivoEmBranco.data",null);
		criaArquivoTeste("ArquivoInvalido.data", new ArrayList<Usuario>());
	}
	
	@Test
	public void testLerEstabelecimentos() {
			
		Assert.assertNotNull(LeituraDeDados.lerEstabelecimentos("lista_estabelecimentos_projeto_lp2-v2.data"));
		Assert.assertNotNull(LeituraDeDados.lerEstabelecimentos("sfas.d"));
		Assert.assertEquals(estabelecimentosListaVazia,LeituraDeDados.lerEstabelecimentos("ArquivoEmBranco.data"));
		Assert.assertEquals(estabelecimentosListaVazia,LeituraDeDados.lerEstabelecimentos("ArquivoInvalido.data"));
	}

	@Test
	public void testLerUsuarios(){
		Assert.assertNotNull(LeituraDeDados.lerUsuarios("sfas.d"));
		Assert.assertTrue(user1.equals(LeituraDeDados.lerUsuarios("ArquivoDeUsuarioValido.data").get(0)));
		Assert.assertTrue(user2.equals(LeituraDeDados.lerUsuarios("ArquivoDeUsuarioValido.data").get(1)));
	}

	@Test
	public void testIsArquivoEstValid() {
		Assert.assertTrue(LeituraDeDados.isArquivoEstValid("lista_estabelecimentos_projeto_lp2-v2.data"));
		Assert.assertFalse(LeituraDeDados.isArquivoEstValid("ArquivoInvalido.data"));
		Assert.assertFalse(LeituraDeDados.isArquivoEstValid(""));
		Assert.assertFalse(LeituraDeDados.isArquivoEstValid(null));
		Assert.assertFalse(LeituraDeDados.isArquivoEstValid("ArquivoEmBranco.data"));
	}

	@Test
	public void testIsArquivoUserValid() {
		Assert.assertTrue(LeituraDeDados.isArquivoUserValid("ArquivoDeUsuarioValido.data"));
		Assert.assertFalse(LeituraDeDados.isArquivoUserValid(""));
		Assert.assertFalse(LeituraDeDados.isArquivoUserValid(null));
		Assert.assertFalse(LeituraDeDados.isArquivoUserValid("ArquivoInvalido.data"));
		Assert.assertFalse(LeituraDeDados.isArquivoUserValid("ArquivoEmBranco.data"));
	}

	@Test
	public void testGeraMatrizDados() {
		Assert.assertTrue(LeituraDeDados.geraMatrizDados(usuarios) instanceof String[][] );
		
	}
	
	private void criaArquivoTeste(String fileName, List<Usuario> users){
		PrintWriter outputStream = null;
		String linhaInicial = "Indicação de data e hora;Seu nome;Bar do Cuscuz e Restaurante;Baixinho Bar e Restaurante;Bar do George;Bar do Santos;Bodão Bar e Restaurante;Bonaparte;Bongustaio;Cabana do Possidônio;Cantina da Sayonara;Cantina de Dona Inês;Cantina de Olavo;Cantina do Departamento de Meteorologia;Cantina do Hall das Placas;Cantinho Universitário;Chinatown;Divino Fogão;Fazenda;Giraffas;Girassol;Gulas;Manoel da carne de sol;Marmitaria ArtCulinária;Marmitaria Bom paladar;Marmitaria da Mama;Paladar;Pedro da Picanha;Qdoca Bar e Restaurante;Restaurante Brasília;Restaurante da Quadra;Restaurante do Alexandre;Restaurante do Paraná;Restaurante Golden in China;Restaurante Lay China;Riso;Spolleto;Super China Restaurante;Trailer do Marcus;Tuxá;Varandas Bar e Restaurante";
		
		try{
			outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8")));
			if(users != null){
				outputStream.println(linhaInicial);
				for(Usuario u: users){
					outputStream.println(u.toString());
				}				
			}
			
		}catch(FileNotFoundException e2){

		}catch(IOException e){
		}
		finally{
			if (outputStream != null) {
	            outputStream.close();
	         }
		}
	}

}